#pragma once

#include <string>
#include <vector>
#include <memory>
#include <unordered_map>
#include <mutex>
#include <atomic>
#include <functional>
#include <chrono>
#include <thread>
#include <condition_variable>

#include "market_data_types.h"
#include "market_data_monitor.h"
#include "market_data_storage.h"
#include "market_data_receiver.h"

namespace hft {

/**
 * @brief 市场数据管理器
 * 
 * 负责管理市场数据的接收、处理、监控和存储
 */
class MarketDataManager {
public:
    /**
     * @brief 构造函数
     * @param receiver 市场数据接收器
     * @param storage 市场数据存储
     * @param monitor 市场数据监控
     */
    MarketDataManager(
        std::shared_ptr<MarketDataReceiver> receiver,
        std::shared_ptr<AsyncMarketDataStorage> storage,
        std::shared_ptr<MarketDataMonitor> monitor);
    
    ~MarketDataManager();

    /**
     * @brief 初始化管理器
     * @return 是否成功
     */
    bool initialize();

    /**
     * @brief 启动数据接收
     * @return 是否成功
     */
    bool start();

    /**
     * @brief 停止数据接收
     */
    void stop();

    /**
     * @brief 订阅合约
     * @param symbols 合约代码列表
     * @return 成功订阅的合约数量
     */
    int subscribe(const std::vector<std::string>& symbols);

    /**
     * @brief 取消订阅合约
     * @param symbols 合约代码列表
     * @return 成功取消订阅的合约数量
     */
    int unsubscribe(const std::vector<std::string>& symbols);

    /**
     * @brief 获取当前订阅的合约列表
     * @return 合约代码列表
     */
    std::vector<std::string> getSubscribedSymbols() const;

    /**
     * @brief 获取最新的市场数据
     * @param symbol 合约代码
     * @return 市场数据，如果不存在则返回空对象
     */
    MarketDataMessage getLatestMarketData(const std::string& symbol) const;

    /**
     * @brief 查询历史数据
     * @param symbol 合约代码
     * @param start_time 开始时间
     * @param end_time 结束时间
     * @return 历史数据列表
     */
    std::vector<MarketDataMessage> queryHistoricalData(
        const std::string& symbol,
        const std::chrono::system_clock::time_point& start_time,
        const std::chrono::system_clock::time_point& end_time) const;

    /**
     * @brief 注册市场数据回调
     * @param callback 回调函数
     * @return 回调ID，用于取消注册
     */
    int registerMarketDataCallback(
        std::function<void(const MarketDataMessage&)> callback);

    /**
     * @brief 取消注册市场数据回调
     * @param callback_id 回调ID
     * @return 是否成功
     */
    bool unregisterMarketDataCallback(int callback_id);

    /**
     * @brief 获取数据质量报告
     * @return 数据质量报告
     */
    std::unordered_map<std::string, MarketDataMonitor::Statistics> getDataQualityReport() const;

    /**
     * @brief 获取存储统计信息
     * @return 存储统计信息
     */
    uint64_t getStorageStats() const;

    /**
     * @brief 清理旧数据
     * @param days 保留天数
     * @return 清理的记录数
     */
    int cleanupOldData(int days);

private:
    /**
     * @brief 处理市场数据
     * @param data 市场数据消息
     */
    void handleMarketData(const MarketDataMessage& data);

    /**
     * @brief 维护线程函数
     */
    void maintenanceThreadFunc();

private:
    std::shared_ptr<MarketDataReceiver> receiver_;
    std::shared_ptr<AsyncMarketDataStorage> storage_;
    std::shared_ptr<MarketDataMonitor> monitor_;
    
    std::atomic<bool> running_{false};
    std::atomic<int> next_callback_id_{1};
    
    // 最新市场数据缓存
    std::unordered_map<std::string, MarketDataMessage> latest_data_;
    mutable std::mutex data_mutex_;
    
    // 回调函数
    std::unordered_map<int, std::function<void(const MarketDataMessage&)>> callbacks_;
    mutable std::mutex callback_mutex_;
    
    // 维护线程
    std::thread maintenance_thread_;
    std::condition_variable maintenance_cv_;
    std::mutex maintenance_mutex_;
    
    // 订阅的合约
    std::vector<std::string> subscribed_symbols_;
    mutable std::mutex subscription_mutex_;
};

} // namespace hft